{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 230,
   "id": "d2dd00e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "id": "18ace63a",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.loadtxt('../data/USA_Housing.csv',delimiter=',',dtype=str)\n",
    "data = data[1:].astype(float)\n",
    "data = np.random.permutation(data)\n",
    "\n",
    "ratio = 0.8\n",
    "split = int(len(data)*ratio)\n",
    "train = data[:split]\n",
    "test = data[split:]\n",
    "\n",
    "scaler = StandardScaler()\n",
    "scaler.fit(train)\n",
    "train = scaler.transform(train)\n",
    "test = scaler.transform(test)\n",
    "\n",
    "x_train, x_test = train[:,:-1], test[:,:-1]\n",
    "y_train, y_test = train[:,-1], test[:, -1]\n",
    "\n",
    "X = np.concatenate([np.ones(len(x_train)).reshape(-1,1),x_train],axis=1)\n",
    "X_test = np.concatenate([np.ones(len(x_test)).reshape(-1,1),x_test],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "id": "e9d86217",
   "metadata": {},
   "outputs": [],
   "source": [
    "def batch_generator(x, y, batch_size, shuffle=True):\n",
    "    batch_count = 0\n",
    "    if shuffle:\n",
    "        idx = np.random.permutation(len(x))\n",
    "        x = x[idx]\n",
    "        y = y[idx]\n",
    "    while True:\n",
    "        start = batch_count * batch_size\n",
    "        end = min(start + batch_size ,len(x))\n",
    "        batch_count += 1\n",
    "        if start>=end:\n",
    "            break\n",
    "        yield x[start:end], y[start:end]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "id": "3062c380",
   "metadata": {},
   "outputs": [],
   "source": [
    "def SGD(num_epoch, batch_size, learning_rate):\n",
    "    train_losses = []\n",
    "    test_losses = []\n",
    "    theta = np.random.normal(size=X.shape[1]).reshape(6,1)\n",
    "    for epoch in range(num_epoch):\n",
    "        gen = batch_generator(X, y_train, batch_size=batch_size, shuffle=True)\n",
    "        for x_batch, y_batch in gen:\n",
    "            grad = x_batch.T @ (x_batch @ theta - y_batch.reshape(32,1))\n",
    "            theta = theta - learning_rate * grad / len(x_batch)\n",
    "        train_loss = np.sqrt((np.square(y_train.reshape(-1,1) - X @ theta).mean()))\n",
    "        train_losses.append(train_loss)\n",
    "        test_loss = np.sqrt((np.square(y_test.reshape(-1,1) - X_test @ theta).mean()))\n",
    "        test_losses.append(test_loss)\n",
    "\n",
    "    return theta,train_losses,test_losses\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "id": "3cb7d99d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.00191534],\n",
       "       [0.64514202],\n",
       "       [0.45687223],\n",
       "       [0.33727683],\n",
       "       [0.00491184],\n",
       "       [0.42477232]])"
      ]
     },
     "execution_count": 234,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_epoch = 20\n",
    "batch_size = 32\n",
    "learning_rate = 0.01\n",
    "theta,train_losses,test_losses = SGD(num_epoch, batch_size, learning_rate)\n",
    "theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "id": "52ece508",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "plt.plot(np.arange(num_epoch),train_losses)\n",
    "plt.plot(np.arange(num_epoch),test_losses)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "id": "2e409660",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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k4iIiEhFZWVlERYWVurjhllWXXEBdrudvXv3EhISgmEYlfa8mZmZxMfHs2vXLkJDQyvteV2VN62v1tVzedP6al09l7esr2maZGVlERMTg81W+sgQt9gzYrPZiIuLq7LnDw0N9ehfhtN50/pqXT2XN62v1tVzecP6nm2PyAkawCoiIiKWUhkRERERS3l1GQkICGD8+PEEBARYHaVaeNP6al09lzetr9bVc3nb+pbFLQawioiIiOfy6j0jIiIiYj2VEREREbGUyoiIiIhYSmVERERELOXxZeTNN98kISGBwMBAunTpwm+//XbW+b/++muaN29OYGAgrVu35ocffqimpOdnwoQJdOrUiZCQECIiIkhKSiI5Ofmsy0yaNAnDMIrdAgMDqynxuXvsscfOyN28efOzLuOu2zUhIeGMdTUMg1GjRpU4v7tt019++YVBgwYRExODYRhMmzat2OOmafLoo48SHR1NUFAQffr0YcuWLWU+b0Vf99XhbOtaUFDAgw8+SOvWralRowYxMTGMGDGCvXv3nvU5z+W1UB3K2q7XX3/9Gbn79+9f5vO64naFste3pNewYRg8//zzpT6nq27bquLRZeTLL79kzJgxjB8/nlWrVtG2bVv69evH/v37S5x/6dKlXHPNNdx4442sXr2apKQkkpKSWL9+fTUnr7iFCxcyatQofv31V+bMmUNBQQF9+/YlOzv7rMuFhoayb98+523Hjh3VlPj8tGrVqljuxYsXlzqvO2/XFStWFFvPOXPmAPDPf/6z1GXcaZtmZ2fTtm1b3nzzzRIff+6553jttdd4++23Wb58OTVq1KBfv37k5uaW+pwVfd1Xl7Ot67Fjx1i1ahWPPPIIq1atYsqUKSQnJzN48OAyn7cir4XqUtZ2Bejfv3+x3J9//vlZn9NVtyuUvb6nrue+ffv48MMPMQyDv//972d9XlfctlXG9GCdO3c2R40a5fy6qKjIjImJMSdMmFDi/EOGDDEHDhxYbFqXLl3MW2+9tUpzVoX9+/ebgLlw4cJS5/noo4/MsLCw6gtVScaPH2+2bdu23PN70na96667zEaNGpl2u73Ex911m5qmaQLm1KlTnV/b7XYzKirKfP75553T0tPTzYCAAPPzzz8v9Xkq+rq3wunrWpLffvvNBMwdO3aUOk9FXwtWKGldR44caV555ZUVeh532K6mWb5te+WVV5q9e/c+6zzusG0rk8fuGcnPz+f333+nT58+zmk2m40+ffqwbNmyEpdZtmxZsfkB+vXrV+r8riwjIwOA8PDws8539OhRGjRoQHx8PFdeeSUbNmyojnjnbcuWLcTExNCwYUOGDx/Ozp07S53XU7Zrfn4+kydP5oYbbjjrBSPddZueLiUlhdTU1GLbLiwsjC5dupS67c7lde+qMjIyMAyDWrVqnXW+irwWXMmCBQuIiIigWbNm3H777Rw6dKjUeT1pu6alpTFz5kxuvPHGMud11217Ljy2jBw8eJCioiIiIyOLTY+MjCQ1NbXEZVJTUys0v6uy2+3cfffd9OjRgwsuuKDU+Zo1a8aHH37Id999x+TJk7Hb7XTv3p3du3dXY9qK69KlC5MmTeLHH39k4sSJpKSk0LNnT7Kyskqc31O267Rp00hPT+f6668vdR533aYlObF9KrLtzuV174pyc3N58MEHueaaa856EbWKvhZcRf/+/fnkk0+YN28ezz77LAsXLmTAgAEUFRWVOL+nbFeAjz/+mJCQEK6++uqzzueu2/ZcucVVe6ViRo0axfr168s8vtitWze6devm/Lp79+60aNGCd955hyeffLKqY56zAQMGOO+3adOGLl260KBBA7766qtyvdtwVx988AEDBgwgJiam1HncdZvKSQUFBQwZMgTTNJk4ceJZ53XX18KwYcOc91u3bk2bNm1o1KgRCxYs4LLLLrMwWdX78MMPGT58eJkDy911254rj90zUrduXXx8fEhLSys2PS0tjaioqBKXiYqKqtD8rmj06NHMmDGD+fPnExcXV6Fl/fz8aN++PVu3bq2idFWjVq1aNG3atNTcnrBdd+zYwdy5c7npppsqtJy7blPAuX0qsu3O5XXvSk4UkR07djBnzpwKX1q+rNeCq2rYsCF169YtNbe7b9cTFi1aRHJycoVfx+C+27a8PLaM+Pv706FDB+bNm+ecZrfbmTdvXrF3jqfq1q1bsfkB5syZU+r8rsQ0TUaPHs3UqVP5+eefSUxMrPBzFBUVsW7dOqKjo6sgYdU5evQo27ZtKzW3O2/XEz766CMiIiIYOHBghZZz120KkJiYSFRUVLFtl5mZyfLly0vddufyuncVJ4rIli1bmDt3LnXq1Knwc5T1WnBVu3fv5tChQ6XmdufteqoPPviADh060LZt2wov667bttysHkFblb744gszICDAnDRpkrlx40bzlltuMWvVqmWmpqaapmma1113nfnQQw8551+yZInp6+trvvDCC+amTZvM8ePHm35+fua6deusWoVyu/32282wsDBzwYIF5r59+5y3Y8eOOec5fX0ff/xxc/bs2ea2bdvM33//3Rw2bJgZGBhobtiwwYpVKLd7773XXLBggZmSkmIuWbLE7NOnj1m3bl1z//79pml61nY1TcenBurXr28++OCDZzzm7ts0KyvLXL16tbl69WoTMF966SVz9erVzk+QPPPMM2atWrXM7777zly7dq155ZVXmomJiWZOTo7zOXr37m2+/vrrzq/Let1b5Wzrmp+fbw4ePNiMi4sz16xZU+w1nJeX53yO09e1rNeCVc62rllZWeZ9991nLlu2zExJSTHnzp1rXnjhhWaTJk3M3Nxc53O4y3Y1zbJ/j03TNDMyMszg4GBz4sSJJT6Hu2zbquLRZcQ0TfP1118369evb/r7+5udO3c2f/31V+djvXr1MkeOHFls/q+++sps2rSp6e/vb7Zq1cqcOXNmNSc+N0CJt48++sg5z+nre/fddzt/NpGRkeYVV1xhrlq1qvrDV9DQoUPN6Oho09/f34yNjTWHDh1qbt261fm4J21X0zTN2bNnm4CZnJx8xmPuvk3nz59f4u/tiXWy2+3mI488YkZGRpoBAQHmZZdddsbPoUGDBub48eOLTTvb694qZ1vXlJSUUl/D8+fPdz7H6eta1mvBKmdb12PHjpl9+/Y169WrZ/r5+ZkNGjQwb7755jNKhbtsV9Ms+/fYNE3znXfeMYOCgsz09PQSn8Ndtm1VMUzTNKt014uIiIjIWXjsmBERERFxDyojIiIiYimVEREREbGUyoiIiIhYSmVERERELKUyIiIiIpZSGRERERFLqYyIiIiIpVRGRERExFIqIyIiImIplRERERGxlMqIiIiIWOr/AS5X86TtoTQnAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_epoch = 20\n",
    "batch_size = 32\n",
    "lr1 = 0.1\n",
    "lr2 = 0.01\n",
    "lr3 = 0.001\n",
    "_,train_losses1,_ = SGD(num_epoch, batch_size, lr1)\n",
    "_,train_losses2,_ = SGD(num_epoch, batch_size, lr2)\n",
    "_,train_losses3,_ = SGD(num_epoch, batch_size, lr3)\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(np.arange(num_epoch),train_losses1)\n",
    "plt.plot(np.arange(num_epoch),train_losses2)\n",
    "plt.plot(np.arange(num_epoch),train_losses3)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "id": "4b5ba8bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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X43p2r296aabzNe+9rVO93HCvb2QXFsZaWxsVEVFhfLy8qxtcXFxysvLU3l5ebvHlJeXt9pfkvLz8zvcP5oFAgFJ0kUXXdTpfsePH9ewYcOUmZmpm266Se+++25vNO+8ffjhh8rIyNDll1+uW265Rfv37+9wX7fc18bGRv32t7/V97///U4XjHTqPT3b3r17VVlZ2ere+Xw+5eTkdHjvuvO9j1aBQEAej0cpKSmd7hfJdyGalJWVafDgwRoxYoTuueceffbZZx3u66b7WlVVpU2bNun2228/575Ovbfd4dowcuzYMQWDQaWlpbXanpaWpsrKynaPqaysjGj/aBUKhXTvvfdq8uTJGjVqVIf7jRgxQqtXr9Yf//hH/fa3v1UoFNKkSZP06aef9mJrI5eTk6O1a9dqy5Yteuqpp7R3715de+21qq2tbXd/t9zXjRs3yu/367bbbutwH6fe0/aE708k96473/todPLkSc2fP18zZszodBG1SL8L0eKGG27Qr3/9a5WWluqxxx7Tq6++qilTpigYDLa7v1vuqyQ9++yzGjhwoL75zW92up9T7213OWLVXkRmzpw5+uc//3nO54u5ubnKzc21fp40aZK+8IUv6Be/+IUefvjhnm5mt02ZMsX67zFjxignJ0fDhg3T888/36V/bTjVM888oylTpigjI6PDfZx6T9GiqalJ3/3ud2WM0VNPPdXpvk79Lnzve9+z/nv06NEaM2aMrrjiCpWVlem6666zsWU9b/Xq1brlllvO2bHcqfe2u1xbGUlNTVV8fLyqqqpaba+qqlJ6enq7x6Snp0e0fzSaO3eu/vznP+uVV17RpZdeGtGxffr00bhx47Rnz54eal3PSElJ0fDhwztstxvu6759+7Rt2zbdcccdER3n1Hsqybo/kdy77nzvo0k4iOzbt09bt26NeGn5c30XotXll1+u1NTUDtvt9Psa9te//lW7d++O+HssOffedpVrw0hiYqLGjx+v0tJSa1soFFJpaWmrfzmeKTc3t9X+krR169YO948mxhjNnTtXL774ov7v//5Pl112WcTnCAaDeueddzRkyJAeaGHPOX78uD766KMO2+3k+xq2Zs0aDR48WFOnTo3oOKfeU0m67LLLlJ6e3ure1dTU6I033ujw3nXnex8twkHkww8/1LZt23TxxRdHfI5zfRei1aeffqrPPvusw3Y7+b6e6ZlnntH48eOVnZ0d8bFOvbddZncP2p60fv164/V6zdq1a82//vUvc9ddd5mUlBRTWVlpjDHm1ltvNQsWLLD2/9vf/mYSEhLMz372M/Pee++Z4uJi06dPH/POO+/YdQldds899xifz2fKysrM4cOHrdeJEyesfc6+3iVLlpiXX37ZfPTRR6aiosJ873vfM0lJSebdd9+14xK67D//8z9NWVmZ2bt3r/nb3/5m8vLyTGpqqjly5Igxxl331ZhTowY+97nPmfnz57d5z+n3tLa21rz55pvmzTffNJLM8uXLzZtvvmmNIHn00UdNSkqK+eMf/2jefvttc9NNN5nLLrvM1NfXW+f42te+Zn7+859bP5/re2+Xzq61sbHRTJs2zVx66aVm165drb7DDQ0N1jnOvtZzfRfs0tm11tbWmvvvv9+Ul5ebvXv3mm3btpkvfelL5sorrzQnT560zuGU+2rMuf8/NsaYQCBg+vXrZ5566ql2z+GUe9tTXB1GjDHm5z//ufnc5z5nEhMTzcSJE83rr79uvfeVr3zFzJo1q9X+zz//vBk+fLhJTEw0V111ldm0aVMvt7h7JLX7WrNmjbXP2dd77733Wr+btLQ0c+ONN5qdO3f2fuMjVFhYaIYMGWISExPN0KFDTWFhodmzZ4/1vpvuqzHGvPzyy0aS2b17d5v3nH5PX3nllXb/vw1fUygUMosWLTJpaWnG6/Wa6667rs3vYdiwYaa4uLjVts6+93bp7Fr37t3b4Xf4lVdesc5x9rWe67tgl86u9cSJE+b66683l1xyienTp48ZNmyYufPOO9uECqfcV2PO/f+xMcb84he/MH379jV+v7/dczjl3vYUjzHG9GjpBQAAoBOu7TMCAACcgTACAABsRRgBAAC2IowAAABbEUYAAICtCCMAAMBWhBEAAGArwggAALAVYQQAANiKMAIAAGxFGAEAALYijAAAAFv9/64uI6rnPs1iAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr4 = 1.5\n",
    "_,train_losses4,_ = SGD(num_epoch=20, batch_size=batch_size, learning_rate = lr4)\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(np.arange(num_epoch),train_losses4)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "younger",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.23"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
